﻿// <copyright file="INode.cs" company="City of Portland, BES-ASM">
// </copyright>
// <summary>INode interface</summary>

namespace BESASM.EMGAATS.BusinessClasses
{
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  /// <summary>
  /// Interface for <see cref="Node"/>
  /// </summary>
  public interface INode : IEntity
  {
    /// <summary>
    /// Gets or sets the point representing this node.
    /// </summary>
    IPoint Geometry { get; set; }

    /// <summary>
    /// Gets or sets the user-friendly node name.
    /// </summary>
    string NodeName { get; set; }

    /// <summary>
    /// Gets or sets type of node.
    /// </summary>
    NodeType NodeType { get; set; }

    /// <summary>
    /// Gets the node invert elevation in feet
    /// </summary>
    double NodeIEFt { get; }

    /// <summary>
    /// Gets the x coordinate based on the point's geometry.
    /// </summary>
    double X { get; }

    /// <summary>
    /// Gets the y coordinate based on the point's geometry.
    /// </summary>
    double Y { get; }

    /// <summary>
    /// Gets or sets the ground elevation for this node in feet.
    /// </summary>
    double GroundElevFt { get; set; }

    /// <summary>
    /// Gets or sets an enumeration of the node top type controlling the fate of water when the node is filled to the top.
    /// </summary>
    NodeTopType TopType { get; set; }

    /// <summary>
    /// Gets or sets the diameter of the vertical extent of the node in feet.
    /// </summary>
    double DiameterFt { get; set; }

    /// <summary>
    /// Gets the collection of areas that drain directly to this node via a director.
    /// </summary>
    List<IArea> UpstreamAreas { get; }

    /// <summary>
    /// Gets the collection of upstream links that connect to this node.
    /// </summary>
    List<ILink> UpstreamLinks { get; }

    /// <summary>
    /// Gets the collection of weirs that connect to this node
    /// </summary>
    List<IWeir> AttachedWeirs { get; }

    /// <summary>
    /// Gets the collection of orifices that connect to this node
    /// </summary>
    List<IOrifice> AttachedOrifices { get; }

    /// <summary>
    /// Gets the collection of storages that connect to this node
    /// </summary>
    IStorage AttachedStorage { get; }
  }
}
